#!/bin/bash
# 飞牛OS磁盘管理部署脚本（带交互流程+业务脚本功能裁剪+卸载恢复）
# 终端颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BOLD='\033[1m'
NC='\033[0m'
# 路径常量 - 修改业务脚本路径为/usr/local/bin/
SERVICE_SCRIPT="/usr/local/bin/scsi-disk-manager"
UDEV_RULE="/etc/udev/rules.d/99-scsi-disk-trigger.rules"
SYSTEMD_SERVICE="/etc/systemd/system/scsi-disk-manager.service"
LOG_DIR="/vol1/1000/_HDDlog"
LOG_FILE="$LOG_DIR/scsi-disk-manager.log"

# 权限检查
if [[ $EUID -ne 0 ]]; then
    echo "【权限错误】需root权限运行，可在指令前面加sudo临时提权"
    exit 1
fi

# 交互流程1：重要提示
interactive_step1() {
    clear
    echo -e "${BOLD}${RED}【重要提示】${NC}"
    echo -e "${BOLD}此脚本会${RED}强制启用${NC}${BOLD}所选功能，新插入磁盘会自动触发，且涉及${RED}所有磁盘${NC}${BOLD}的配置！${NC}"
    echo -e "${BOLD}脚本功能会对休眠硬盘、冷备盘造成影响！${RED}有硬盘休眠需求或冷备盘的谨慎配置${NC}${BOLD}，以免造成磁盘电源管理冲突。${NC}"
    echo -e "飞牛系统的储存空间1通常挂载为/vol1/1000，此目录正常挂载是部署的前置条件。业务脚本触发时会向储存空间1/_HDDlog目录）写入日志而影响储存空间1休眠。仅储存空间1长期的用户推荐使用。"
    echo -e "脚本为作者使用AI工具生成的。自用自测飞牛0.9.32版可适用，其他版本不作测试，分享仅作交流学习。"
    echo -e "${BOLD}${RED}脚本是否产生其他未知问题不作测试，由此产生的风险及问题请自行承担！${NC}"
    echo -e "或尝试重新运行原始脚本进行卸载清理，卸载时会将所有磁盘所有功能配置关键值强制改为0（禁用）。注意：此前未部署过脚本也会强制修改为0。未能恢复尝试关机断电后再开机查看是否解决问题。"

    echo -e "\n${BOLD}【请选择安装或卸载】${NC}"
    echo "1. 安装并开启磁盘管理配置（生成业务脚本+systemd开机自启＋udev自动触发）"
    echo "2. 一键卸载（将所有磁盘所有功能配置关键值强制改为0（禁用）注意：此前未使用过脚本也会强制修改为0。清理所有相关文件）"
    echo -e "\n${YELLOW}操作说明：单选1或2，无操作2分钟后自动退出，按ctrl+c中断退出${NC}"
    
    while true; do
        read -t 120 OPTION
        if [ $? -ne 0 ]; then
            echo -e "\n${RED}2分钟无操作，自动退出${NC}"
            exit 0
        fi
        
        if [ "$OPTION" = "1" ] || [ "$OPTION" = "2" ]; then
            break
        else
            echo -e "${RED}无效选项，请重新输入1或2${NC}"
        fi
    done

    # 若选择卸载，执行卸载流程；选择安装，继续后续功能选择
    if [ "$OPTION" = "2" ]; then
        uninstall
    else
        interactive_step2
    fi
}
  
# 卸载函数（含配置改0，删除日志清理）
uninstall() {
    # 卸载前二次确认
    clear
    echo -e "${BOLD}${RED}【卸载二次确认】${NC}"
    echo -e "${BOLD}此操作会执行：${NC}"
    echo "将所有磁盘的功能配置关键位强制修改为0，注意：此前未使用过脚本也会强制修改为0。"
    echo "清理systemd服务、"
    echo "清理udev规则、"
    echo "清理业务脚本、"
    echo "清理脚本日志目录"
    echo -e "\n${YELLOW}确认卸载请输入y，返回上一步请输入n，2分钟无操作将退出${NC}"
    
    while true; do
        read -t 120 CONFIRM_UNINSTALL
        if [ $? -ne 0 ]; then
            echo -e "\n${RED}2分钟无操作，自动退出${NC}"
            exit 0
        fi
        
        if [ "$CONFIRM_UNINSTALL" = "y" ] || [ "$CONFIRM_UNINSTALL" = "Y" ]; then
            break
        elif [ "$CONFIRM_UNINSTALL" = "n" ] || [ "$CONFIRM_UNINSTALL" = "N" ]; then
            interactive_step1
            return
        else
            echo -e "${RED}输入无效，请输入y确认卸载或n返回上一步${NC}"
        fi
    done

    # 原卸载逻辑（恢复配置+清理组件）
    echo -e "\n${BOLD}【卸载步骤1：所有磁盘恢复所有功能配置关键值改为0】${NC}"
    for disk_dir in /sys/class/scsi_disk/*; do
        [[ -d "$disk_dir" ]] || continue
        disk_scsi_id=$(basename "$disk_dir")
        echo "恢复磁盘$disk_scsi_id的配置..."
        
        for func in "manage_runtime_start_stop" "manage_shutdown" "manage_system_start_stop"; do
            file_path="$disk_dir/$func"
            if [[ -f "$file_path" && $(cat "$file_path") -eq 1 ]]; then
                echo 0 > "$file_path"
                echo "  - 已改$func为0"
            fi
        done
    done
    echo -e "\n${BOLD}【卸载步骤2：清理组件】${NC}"
    # 1. 清理systemd服务
if [ -f "$SYSTEMD_SERVICE" ]; then
    # 先停止服务（若正在运行）
    if systemctl is-active --quiet scsi-disk-manager.service; then
        systemctl stop scsi-disk-manager.service
    fi
    # 关键修改：捕获 systemctl disable 的输出，判断是否删除开机自启链接
    echo "正在禁用systemd服务开机自启..."
    DISABLE_OUTPUT=$(systemctl disable scsi-disk-manager.service 2>&1)  # 捕获 stdout 和 stderr
    if echo "$DISABLE_OUTPUT" | grep -q "Removed"; then
        # 捕捉到 Removed 提示，说明开机自启链接已成功删除
        echo "  - 已成功删除 scsi-disk-manager 服务的开机自启链接"
    else
        # 未捕捉到，提示可能未删除（可能本身未启用开机自启，或链接不存在）
        echo "  - 未检测到开机自启链接（可能已删除或未启用），跳过链接删除"
    fi
    # 删除服务文件
    rm -f "$SYSTEMD_SERVICE"
    systemctl daemon-reload
    echo "1. 已清理systemd服务"
else
    echo "1. systemd服务文件不存在，跳过清理"
fi
    # 2. 清理udev规则
    if [ -f "$UDEV_RULE" ]; then
        rm -f "$UDEV_RULE"
        udevadm control --reload-rules
        echo "2. 已清理udev规则"
    else
        echo "2. udev规则文件不存在，跳过清理"
    fi
    # 3. 清理业务脚本（同步更新路径）
    if [ -f "$SERVICE_SCRIPT" ]; then
        rm -f "$SERVICE_SCRIPT"
        echo "3. 已清理业务脚本"
    else
        echo "3. 业务脚本不存在，跳过清理"
    fi
    # 4. 清理日志目录（自定义日志）
    if [ -d "$LOG_DIR" ]; then
        rm -rf "$LOG_DIR"
        echo "4. 已清理自定义日志目录"
    else
        echo "4. 自定义日志目录不存在，跳过清理"
    fi
    echo -e "\n${GREEN}✅ 【卸载完成】所有磁盘的配置关键值已改为0，组件已清理${NC}"
    exit 0
}

# 交互流程2：功能项选择
interactive_step2() {
    clear
    echo -e "${BOLD}【功能选择详细说明】${NC}"
    echo -e "请注意阅读详细说明，同意后按需选择！"
    echo -e "此脚本3项功能配置是针对硬盘的运行/关机/系统层面的管理策略开关，0和1代表“禁用/启用”对应功能："
    echo -e "\n${BOLD}【功能1】. manage_runtime_start_stop（运行时休眠/唤醒管理）${NC}"
    echo -e "• 功能作用：控制硬盘在系统运行过程中的休眠、唤醒逻辑。${RED}不知道啥逻辑，只知道开启会强制保持硬盘活跃。${NC}"
    echo -e "• 脚本会修改关键值为1（启用）：硬盘运行时电源管理；0（禁用）：系统/其他工具控制。"
    echo -e "\n${BOLD}${GREEN}【功能2】. manage_shutdown（关机安全断电管理）${YELLOW}建议仅选择2${NC}"
    echo -e "• 功能作用：控制硬盘在系统关机/重启阶段的断电逻辑（确保数据同步、安全断电）。"
    echo -e "• 脚本会修改关键值为1（启用）：安全断电步骤；0（禁用）：系统默认流程。"
    echo -e "\n${BOLD}【功能3】. manage_system_start_stop（系统层面启停管理）${NC}"
    echo -e "• 功能作用：控制硬盘在系统启动/停止服务阶段的状态（自动初始化、重置）。（${RED}开启可能影响冷备盘${NC}）"
    echo "• 脚本会修改关键值为1（启用）：初始化操作；0（禁用）：系统默认流程。"
    
    echo -e "\n${YELLOW}请注意阅读详细说明，同意后按需选择！${NC}"
    
    # 修改点1：提示中增加“输入n返回上一步”
    echo -e "\n${YELLOW}请按需输入要强制启用的功能：1 2 3（可多选，用空格分隔），输入n返回上一步。按ctrl+c中断退出，5分钟无操作自动退出${NC}${RED}建议仅选择2即可解决关机硬盘异响，硬盘不安全断电次数增加的问题${NC}"
    
    # 功能选择验证（增加n返回上一步逻辑和非空检查）
    while true; do
        read -t 300 SELECTED_FUNCS
        if [ $? -ne 0 ]; then
            echo -e "\n${RED}5分钟无操作，自动退出${NC}"
            exit 0
        fi
        # 新增：输入n或N返回上一步
        if [ "$SELECTED_FUNCS" = "n" ] || [ "$SELECTED_FUNCS" = "N" ]; then
            interactive_step1
            return
        fi
        # 新增：检查是否为空输入（纯空格或无输入）
        if [ -z "$SELECTED_FUNCS" ] || [[ "$SELECTED_FUNCS" =~ ^[[:space:]]+$ ]]; then
            echo -e "${RED}输入不能为空！请至少选择一个功能（1/2/3），或输入n返回上一步${NC}"
            continue
        fi
        # 验证输入有效性（仅允许1/2/3和空格）
        VALID=1
        for func in $SELECTED_FUNCS; do
            if [[ ! "$func" =~ ^[123]$ ]]; then
                VALID=0
                break
            fi
        done
        if [ $VALID -eq 1 ]; then
            break
        else
            echo -e "${RED}输入无效！请输入1或2或3（可多选，空格分隔），或输入n返回上一步${NC}"
        fi
    done
    
    interactive_step4 "$SELECTED_FUNCS"
}

# 交互流程4：确认选择
interactive_step4() {
    local SELECTED_FUNCS=$1
    
    echo -e "${BOLD}【已选功能确认】${NC}"
    echo "你选择启用的功能：$SELECTED_FUNCS  最后声明：仅选2即可解决硬盘安全关机问题，最后确认！！！"
    echo -e "\n${YELLOW}确认继续输入y，返回上一步输入n${NC}"
    
    while true; do
        read -t 60 CONFIRM
        if [ $? -ne 0 ]; then
            echo -e "\n${RED}60秒无操作，自动退出${NC}"
            exit 0
        fi
        case "$CONFIRM" in
            y|Y)
                # 确认继续，执行部署
                deploy "$SELECTED_FUNCS"
                break
                ;;
            n|N)
                interactive_step2
                return
                ;;
            *)
                echo -e "${RED}输入无效，请输入y（继续）或n（返回上一步）${NC}"
                ;;
        esac
    done
}

# 部署函数
deploy() {
    local SELECTED_FUNCS=$1
    # 映射功能选择到配置项
    declare -A FUNC_MAP=(
        ["1"]="manage_runtime_start_stop:运行时休眠/唤醒管理"
        ["2"]="manage_shutdown:关机安全断电管理"
        ["3"]="manage_system_start_stop:系统层面启停管理"
    )
    SELECTED_FUNC_LIST=()
    for func in $SELECTED_FUNCS; do
        SELECTED_FUNC_LIST+=("${FUNC_MAP[$func]}")
    done
    
    # 部署步骤1/4，前置检查：/vol1/1000挂载状态（生成业务脚本前最后验证）
    echo -e "\n${BOLD}【部署步骤1/4:检查/vol1/1000挂载状态】${NC}"
    if [ ! -d "/vol1/1000" ]; then
        echo -e "${RED}/vol1/1000 未挂载，无法创建_HDDlog日志目录，部署终止！${NC}"
        echo -e "${YELLOW}说明：此目录为脚本前置条件，飞牛系统通常会自动把储存空间1挂载为/vol1/1000，出现这个问题可能是未创建储存空间1，或储存空间不是挂载此目录。可先创建储存空间1，或先手动挂载数据盘到/vol1/1000（如 sudo mount /dev/xxx（盘符） /vol1/1000），再重新执行脚本。${NC}"
        exit 1
    else
        echo -e "\n${GREEN}✅  检测到/vol1/1000 已挂载，继续生成服务脚本${NC}\n"
        sleep 1
    fi
    
    # 若业务脚本存在，在生成业务脚本前添加覆盖提示：
    if [ -f "$SERVICE_SCRIPT" ]; then
        echo -e "${YELLOW}提示：$SERVICE_SCRIPT 已存在，即将覆盖${NC}"
    fi
    
    # 步骤1/3：动态生成服务脚本（按选择的功能裁剪）
    echo -e "${BOLD}【部署步骤2/4：生成业务脚本】${NC}"
    cat > "$SERVICE_SCRIPT" <<EOF
#!/bin/bash
# 飞牛OS磁盘管理业务脚本（裁剪版）
AUTO_TRIGGER=\${AUTO_TRIGGER:-false}
LOG_DIR="$LOG_DIR"
LOG_FILE="$LOG_FILE"
SERVICE_PATH="$SERVICE_SCRIPT"  # 同步更新业务脚本路径变量
# 5秒等待
if [ "\$AUTO_TRIGGER" = "false" ]; then
    echo -n "【等待阶段】等待/vol1/1000挂载，30秒后开始执行..."
    for ((i=30; i>0; i--)); do
        echo -ne "\r【等待阶段】等待/vol1/1000挂载，\$i秒后开始执行..."
        sleep 1
    done
    echo -e "\r【等待阶段】等待/vol1/1000挂载，0秒后开始执行..."
else
    sleep 30
fi
# 挂载检测
if [ "\$AUTO_TRIGGER" = "false" ]; then
    [ -d "/vol1/1000" ] && echo "/vol1/1000 已挂载" || echo "/vol1/1000 未挂载"
else
    [ -d "/vol1/1000" ] && echo "【自动触发】/vol1/1000 已挂载" >> "\$LOG_FILE" || echo "【自动触发失败】/vol1/1000 未挂载，无法创建_HDDlog日志目录，自动触发失败，请检查储存空间1是否挂载为此路径" >> "\$LOG_FILE"
fi

# 创建日志目录（777权限）
mkdir -p "\$LOG_DIR" 2>/dev/null
chmod 777 "\$LOG_DIR"
touch "\$LOG_FILE" 2>/dev/null
chmod 777 "\$LOG_FILE"
# 权限检查
if [[ \$EUID -ne 0 ]]; then
    echo "【权限错误】需root权限运行" | tee -a "\$LOG_FILE"
    echo "【手动执行提示】若需手动触发配置，可执行：sudo \$SERVICE_PATH" | tee -a "\$LOG_FILE"
    exit 1
fi
# 启动信息
START_TIME=\$(date +'%Y-%m-%d %H:%M:%S')
if [ "\$AUTO_TRIGGER" = "true" ]; then
    echo "
    
    
    ================【自动触发-业务脚本启动】\$START_TIME================
" | tee -a "\$LOG_FILE"
else
    echo "
    
    
    ================【手动触发-业务脚本启动】\$START_TIME================
" | tee -a "\$LOG_FILE"
fi

sleep 1

# 磁盘配置核心逻辑
DISK_TOTAL=\$(ls -A /sys/class/scsi_disk/ 2>/dev/null | wc -l)
echo "【磁盘检测】共读取到\$DISK_TOTAL个硬盘" | tee -a "\$LOG_FILE"
echo | tee -a "\$LOG_FILE"
# 新增：细分统计变量
declare -a SUCCESS_DISKS=()          # 所有配置项均成功的磁盘（含无需处理但无失败项）
declare -a FAILED_DISKS=()           # 至少一项配置失败的磁盘
declare -a NO_OPERATION_DISKS=()     # 所有已选功能均为“无需修改”（原始值1）且无失败项的磁盘
DISK_PROCESSED=0                     # 总处理磁盘数（有效磁盘目录数）
SUCCESS_PROCESSED=0                  # 本次处理成功数（至少一项配置修改成功，且无失败项）
FAILED_PROCESSED=0                   # 本次处理失败数（至少一项配置失败）
NO_OPERATION_COUNT=0                 # 本次无需处理数（所有已选功能均无需修改，且无失败项）

for disk_dir in /sys/class/scsi_disk/*; do
    [[ -d "\$disk_dir" ]] || continue
    DISK_PROCESSED=\$((DISK_PROCESSED + 1))
    
    disk_scsi_id=\$(basename "\$disk_dir")
    disk_dev_subdir=\$(find "\$disk_dir/device/block/" -maxdepth 1 -type d ! -name "block" | head -n1)
    disk_dev=\$(basename "\$disk_dev_subdir")
    disk_dev_path="/dev/\$disk_dev"
    # 获取磁盘信息
    if command -v lsblk &>/dev/null; then
        disk_model=\$(lsblk -no MODEL "\$disk_dev_path" 2>/dev/null || echo "未知型号")
        disk_serial=\$(lsblk -no SERIAL "\$disk_dev_path" 2>/dev/null || echo "未知序列号")
    else
        disk_model="未知型号"
        disk_serial="未知序列号"
    fi
    # 配置输出
    echo "----------------【SCSI_ID:\$disk_scsi_id 磁盘配置】----------------" | tee -a "\$LOG_FILE"
    echo "【硬盘信息】盘符:\$disk_dev_path | 型号:\$disk_model | 序列号:\$disk_serial" | tee -a "\$LOG_FILE"
    echo "【SCSI_ID:\$disk_scsi_id 硬盘】处理结果：" | tee -a "\$LOG_FILE"
    
    # 新增：当前磁盘的状态标记
    all_success=true                  # 所有配置项是否无失败
    has_modification=false            # 是否有配置项被修改（原始值0→1成功）
    all_no_operation=true             # 是否所有配置项均为“无需修改”（原始值1）
    
    # 已选功能配置
    declare -a target_files=(
EOF
    # 写入已选择的功能配置
    for entry in "${SELECTED_FUNC_LIST[@]}"; do
        echo "        \"$entry\"" >> "$SERVICE_SCRIPT"
    done
    # 继续写入业务脚本剩余部分
    cat >> "$SERVICE_SCRIPT" <<EOF
    )
    for entry in "\${target_files[@]}"; do
        file_name=\${entry%:*}
        func_desc=\${entry#*:}
        file_path="\$disk_dir/\$file_name"
        
        if [[ -f "\$file_path" ]]; then
            orig_value=\$(cat "\$file_path")
            printf "%-30s（%-20s） 原始值：%s → " "\$file_name" "\$func_desc" "\$orig_value" | tee -a "\$LOG_FILE"
            
            # 根据原始值判断是否需要修改
            if [[ "\$orig_value" -eq 0 ]]; then
                # 原始值为0，执行修改
                echo 1 > "\$file_path" 2>/dev/null
                new_value=\$(cat "\$file_path")
                if [[ "\$new_value" -eq 1 ]]; then
                    result="新值：\$new_value【成功】"
                    has_modification=true  # 标记有修改操作成功
                    all_no_operation=false # 存在修改项，不是“无需处理”
                else
                    result="新值：\$new_value【失败】"
                    all_success=false      # 标记有失败项
                    all_no_operation=false # 存在失败项，不是“无需处理”
                fi
            else
                # 原始值为1，不修改
                result="保持值：1【无需修改】"
                # 保持all_no_operation为true（需所有项均为无需修改才生效）
            fi
            
            echo "\$result" | tee -a "\$LOG_FILE"
        else
            printf "%-30s（%-20s） 文件不存在【失败】\n" "\$file_name" "\$func_desc" | tee -a "\$LOG_FILE"
            all_success=false          # 标记有失败项
            all_no_operation=false     # 存在失败项，不是“无需处理”
        fi
    done
    echo | tee -a "\$LOG_FILE"
    # 记录结果：按状态分类统计
    disk_info="盘符:\$disk_dev_path | 型号:\$disk_model | 序列号:\$disk_serial | SCSI_ID:\$disk_scsi_id"
    if [ "\$all_success" = true ]; then
        # 无失败项：进一步判断是“无需处理”还是“成功处理”
        if [ "\$all_no_operation" = true ]; then
            # 所有配置项均为“无需修改”
            NO_OPERATION_DISKS+=("\$disk_info")
            NO_OPERATION_COUNT=\$((NO_OPERATION_COUNT + 1))
        else
            # 至少一项修改成功
            SUCCESS_DISKS+=("\$disk_info")
            SUCCESS_PROCESSED=\$((SUCCESS_PROCESSED + 1))
        fi
    else
        # 至少一项失败
        FAILED_DISKS+=("\$disk_info")
        FAILED_PROCESSED=\$((FAILED_PROCESSED + 1))
    fi
done
# 配置统计：修改为新的统计格式
echo "----------------【配置统计】----------------" | tee -a "\$LOG_FILE"
echo "【处理总量】共读取到\$DISK_TOTAL个硬盘 | 本次处理成功\$SUCCESS_PROCESSED个 | 本次处理失败\$FAILED_PROCESSED个 | 本次无需处理\$NO_OPERATION_COUNT个" | tee -a "\$LOG_FILE"
echo "【成功磁盘】\${#SUCCESS_DISKS[@]}个（本次有修改且无失败）：" | tee -a "\$LOG_FILE"
if [ \${#SUCCESS_DISKS[@]} -eq 0 ]; then
    echo "  - 无" | tee -a "\$LOG_FILE"
else
    for d in "\${SUCCESS_DISKS[@]}"; do
        echo "  - \$d" | tee -a "\$LOG_FILE"
    done
fi
echo "【失败磁盘】\${#FAILED_DISKS[@]}个（至少一项配置失败）：" | tee -a "\$LOG_FILE"
if [ \${#FAILED_DISKS[@]} -eq 0 ]; then
    echo "  - 无" | tee -a "\$LOG_FILE"
else
    for d in "\${FAILED_DISKS[@]}"; do
        echo "  - \$d" | tee -a "\$LOG_FILE"
    done
fi
echo "【无需处理磁盘】\${#NO_OPERATION_DISKS[@]}个（所有已选功能均无需修改且无失败）：" | tee -a "\$LOG_FILE"
if [ \${#NO_OPERATION_DISKS[@]} -eq 0 ]; then
    echo "  - 无" | tee -a "\$LOG_FILE"
else
    for d in "\${NO_OPERATION_DISKS[@]}"; do
        echo "  - \$d" | tee -a "\$LOG_FILE"
    done
fi
# 功能提示
SELECTED_FUNC_STR=""
EOF
    # 写入已选功能提示文本
    for func in $SELECTED_FUNCS; do
        SELECTED_FUNC_STR+="${FUNC_MAP[$func]#*:}、"
    done
    SELECTED_FUNC_STR=${SELECTED_FUNC_STR%、}
    # 日志写入提示
    echo "echo \"【提示】1.已为你开启${SELECTED_FUNC_STR}功能配置，\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    echo "echo \"        2.如有问题请尝试重新运行原始脚本进行卸载清理，卸载时所有磁盘配置关键值会强制改为0。\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    echo "echo \"        3.或者卸载后请尝试关机断电后再次开机查看是否恢复。\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    echo "echo \"        4.手动触发磁盘配置：sudo $SERVICE_SCRIPT\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"  # 同步更新手动执行路径
    echo "echo \"        5.卸载脚本：重新执行原始脚本并选择卸载\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    echo "echo \"【日志提示】本日志自动保留最新500行，超出自动清理老旧日志。\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    echo "echo \"如需手动清理请删除日志文件：\$LOG_FILE（储存空间1/_HDDlog目录）\" | tee -a \"\$LOG_FILE\"" >> "$SERVICE_SCRIPT"
    # 写入服务脚本结束部分
    cat >> "$SERVICE_SCRIPT" <<EOF
# 结束信息
END_TIME=\$(date +'%Y-%m-%d %H:%M:%S')
if [ "\$AUTO_TRIGGER" = "true" ]; then
    echo "………………………………【自动触发-业务脚本结束】\$END_TIME………………………………
    
" | tee -a "\$LOG_FILE"
else
    echo "………………………………【手动触发-业务脚本结束】\$END_TIME………………………………
    
" | tee -a "\$LOG_FILE"
fi

# 日志裁剪：仅保留最后500行，避免日志文件过大
if [ -f "\$LOG_FILE" ]; then
# 用tail截取最后500行到临时文件
tail -n 500 "\$LOG_FILE" > "\$LOG_FILE.tmp"
# 用临时文件覆盖原日志文件
mv -f "\$LOG_FILE.tmp" "\$LOG_FILE"
# 恢复日志文件权限
chmod 777 "\$LOG_FILE"
fi

EOF


    # 设置服务脚本权限为777（保持原权限设置）
    chmod 777 "$SERVICE_SCRIPT"
    echo -e "${GREEN}✅  业务脚本已生成${NC}"

    sleep 1

    echo -e "\n${BOLD}【部署步骤3/4：配置systemd服务】${NC}"
    cat > "$SYSTEMD_SERVICE" <<EOF
[Unit]
Description=SCSI Disk Manager Service
After=local-fs.target
[Service]
Type=oneshot
User=root
Group=root
Environment="AUTO_TRIGGER=true"
ExecStart=$SERVICE_SCRIPT
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target
EOF
    # 赋权：777权限
    chmod 777 "$SYSTEMD_SERVICE"

    echo -e "${GREEN}✅  systemd服务文件已生成${NC}"

    # 记录触发前的日志位置（用于后续验证）
    echo "尝试记录触发前日志位置，用于开机自启验证"
    log_position=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)

    # 让 systemd 服务管理器重新读取所有服务配置文件
    systemctl daemon-reload

    # 尝试启用开机自启、启动systemd服务、触发业务脚本执行
    echo -e "⚠ 启用开机自启、启动systemd服务、触发业务脚本执行..."
    echo -e "⚠ 请等待验证systemd服务触发业务脚本，大约35秒..."
    systemctl enable --now scsi-disk-manager.service

    echo -e "${YELLOW}⚠ 请等待日志验证...${NC}"

    # 等待3秒，确保服务有足够时间生成日志
    sleep 3

    # 对比触发前的日志位置检查日志是否有新的触发记录
    new_trigger=$(tail -n +"$log_position" "$LOG_FILE" 2>/dev/null | grep -E "【自动触发-业务脚本启动】")
    if [ -n "$new_trigger" ]; then
        echo -e "  ${GREEN}✓ 开机自启验证成功，已生成自动触发日志${NC}"
       else
        echo -e "  ${YELLOW}⚠ systemd服务开机自启已部署，但未检测到新日志${NC}"
    fi

    # 尝试捕获触发日志，筛选包含服务启动时间的记录（验证systemd服务是否成功触发）
    echo -e "\n${BOLD}【尝试读取日志验证systemd服务触发状态】${NC}"


    # 提取日志中最新的服务启动时间（匹配"【自动触发-业务脚本启动】"或"【手动触发-业务脚本启动】"行的时间戳）
    START_RECORD=$(grep -E "【(自动|手动)触发-业务脚本启动】" "$LOG_FILE" | tail -n 1)
    if [ -n "$START_RECORD" ]; then
        # 提取时间戳（日志行中"【...】"内的时间部分）
        START_TIME=$(echo "$START_RECORD" | sed -n 's/.*【[^】]*】\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).*/\1/p')
        if [ -n "$START_TIME" ]; then
            echo -e "${GREEN}✅  成功捕获脚本启动时间记录：$START_TIME${NC}"
            echo -e "${GREEN}systemd服务开机自启已配置并触发，请在储存空间1/_HDDlog目录查看完整日志${NC}"
        else
            echo -e "${YELLOW}⚠ 捕获到启动记录，但未提取到时间戳，建议手动查看日志确认${NC}"
        fi
    else
        echo -e "${RED}❌ 未捕获到服务启动日志，可能systemd服务触发失败${NC}"
        echo -e "${YELLOW}排查建议：1. 检查服务状态：systemctl status scsi-disk-manager.service 2. 手动查看日志：cat $LOG_FILE${NC}"
    fi

    sleep 1

    # 步骤3：配置udev规则
    echo -e "\n${BOLD}【部署步骤4/4：部署新插入磁盘自动触发udev规则】${NC}"
    cat > "$UDEV_RULE" <<EOF
ACTION=="add", SUBSYSTEM=="scsi_disk", RUN+="/bin/systemctl start scsi-disk-manager.service"
EOF
    chmod 777 "$UDEV_RULE"
    udevadm control --reload-rules
    echo -e "${GREEN}✅  udev规则文件已生成${NC}"

    sleep 1
    # 记录触发前的日志位置（用于后续验证）
    echo "尝试记录触发前日志位置，用于udev触发验证"
    log_position=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)

    # 验证udev规则是否生效（仅触发在线设备，避免唤醒休眠硬盘）代码块开始

    echo -e "\n${BOLD}【验证udev规则有效性】${NC}"
    echo "正在筛选符合条件的scsi_disk设备（避免唤醒休眠硬盘）..."
    echo "---------------------------------------------------"

    # 关键：筛选出当前在线的scsi_disk设备，优先识别U盘（忽略旋转属性误判），排除mmc设备
    declare -a CANDIDATE_DEVICES=()
    declare -a CANDIDATE_DESC=()  # 存储设备筛选描述（用于终端显示和最终引用）
    while read -r dev; do
        # 检查设备是否在线（通过device/state文件判断，"running"为在线）
        state_file="${dev}/device/state"
        if [ ! -f "$state_file" ] || [ "$(cat "$state_file")" != "running" ]; then
            continue
        fi

        # 关联块设备（/dev/sdX）
        disk_scsi_id=$(basename "$dev")
        disk_dev_subdir=$(find "$dev/device/block/" -maxdepth 1 -type d ! -name "block" | head -n1)
        disk_dev=$(basename "$disk_dev_subdir")
        [ -z "$disk_dev" ] && continue  # 无对应块设备，跳过
        disk_dev_path="/dev/$disk_dev"
        
        # 获取设备核心信息（优化默认值）
        disk_model=$(lsblk -d -n -o MODEL "$disk_dev_path" 2>/dev/null || echo "未知型号")
        disk_rm=$(lsblk -d -n -o RM "$disk_dev_path" 2>/dev/null || echo 0)  # 1=可移除
        disk_rotational=$(cat "/sys/block/${disk_dev}/rotational" 2>/dev/null || echo 1)

        # 排除mmc设备（设备名前缀+型号双重判断）
        if echo "$disk_dev" | grep -qi "^mmcblk" || echo "$disk_model" | grep -qi "mmc"; then
            echo "❌ 排除设备：/dev/${disk_dev}（MMC设备，型号：${disk_model}）"
            continue
        fi
        # 新增：排除系统盘（综合判断）
        is_system_disk=false
        # 方法1：检查是否挂载为根文件系统
        if mount | grep -q "^/dev/${disk_dev}[0-9]*.*on.*/ type"; then
          is_system_disk=true
        fi
        # 方法2：检查udev系统盘属性
        if udevadm info -q property -n "/dev/$disk_dev" 2>/dev/null | grep -q "UDISKS_SYSTEM=1"; then
           is_system_disk=true
        fi
        if [ "$is_system_disk" = true ]; then
           echo "❌ 排除设备：/dev/${disk_dev}（系统盘，型号：${disk_model}）"
           continue
        fi

        # 容量解析（兼容小数+多单位，提取整数用于判断，保留原始容量用于显示）
        disk_size_raw=$(lsblk -d -n -o SIZE "$disk_dev_path" 2>/dev/null || echo "0")
        if echo "$disk_size_raw" | grep -qi "G"; then
            disk_size=$(echo "$disk_size_raw" | sed 's/[Gg]//; s/\..*//; s/[^0-9]//g')
        elif echo "$disk_size_raw" | grep -qi "M"; then
            mb_size=$(echo "$disk_size_raw" | sed 's/[Mm]//; s/\..*//; s/[^0-9]//g')
            disk_size=$(( mb_size / 1024 ))
        else
            disk_size=0
        fi
        disk_size=${disk_size:-0}

        # 核心修复：优先判定U盘（忽略旋转属性误判），明确标注判定条件
        is_usb_candidate=0
        if [ "$disk_rm" -eq 1 ] && [ "$disk_size" -lt 64 ]; then
            # 满足「可移除+容量<64GB」，强制视为U盘候选，跳过机械硬盘休眠判定
            is_usb_candidate=1
            device_type="U盘/读卡器"
            # 优化提示：明确说明U盘判定条件（可移除+容量<64GB）
            type_desc="${device_type}（容量：${disk_size_raw}，型号：${disk_model}，判定条件：可移除设备 + 容量<64GB）"
            echo "✅ 符合条件（优先U盘）：/dev/${disk_dev} - ${type_desc}"
            # 直接加入候选列表（标记为u盘类型）
            CANDIDATE_DEVICES+=("$dev|$disk_size|$disk_size_raw|$disk_rm|u盘|$disk_dev|$disk_model|$disk_rotational")
            CANDIDATE_DESC+=("$type_desc")
            continue  # 跳过后续类型判断，直接处理下一个设备
        fi

        # 非U盘设备：正常判断固态/机械，并处理机械硬盘休眠
        if [ "$disk_rotational" = "0" ] || echo "$disk_model" | grep -qiE "ssd|solid state"; then
            disk_type="ssd"
            type_desc="固态硬盘（容量：${disk_size_raw}，型号：${disk_model}，可移除：$( [ "$disk_rm" -eq 1 ] && echo "是" || echo "否" )，判定依据：$( [ "$disk_rotational" = "0" ] && echo "无旋转部件" || echo "型号判定" )"
            # SSD无需休眠判定，直接加入候选
            echo "✅ 符合条件：/dev/${disk_dev} - ${type_desc}"
            CANDIDATE_DEVICES+=("$dev|$disk_size|$disk_size_raw|$disk_rm|$disk_type|$disk_dev|$disk_model|$disk_rotational")
            CANDIDATE_DESC+=("$type_desc")
        else
            # 机械硬盘： hdparm判定休眠状态，power_state_file备选（避免唤醒）
            disk_type="hdd"
            hdd_state_desc=""
            is_active=0
            if command -v hdparm &>/dev/null; then
                hdparm_output=$(hdparm -C "$disk_dev_path" 2>/dev/null | grep "drive state is:")
                if echo "$hdparm_output" | grep -qiE "active|idle"; then
                    is_active=1
                    hdd_state_desc="（未休眠）"
                else
                    hdd_state_desc="（已休眠，跳过）"
                fi
            else
                power_state_file="/sys/block/${disk_dev}/power/state"
                if [ -f "$power_state_file" ]; then
                    power_state=$(cat "$power_state_file")
                    if [ "$power_state" = "0" ] || [ "$power_state" = "active" ] || [ "$power_state" = "idle" ]; then
                        is_active=1
                        hdd_state_desc="（未休眠）"
                    else
                        hdd_state_desc="（已休眠，跳过）"
                    fi
                else
                    hdd_state_desc="（状态未知，默认已休眠，跳过）"
                fi
            fi
            # 未休眠的机械硬盘才加入候选
            if [ "$is_active" -eq 1 ]; then
                type_desc="机械硬盘（容量：${disk_size_raw}，型号：${disk_model}，可移除：$( [ "$disk_rm" -eq 1 ] && echo "是" || echo "否" )，判定依据：有旋转部件）${hdd_state_desc}"
                echo "✅ 符合条件：/dev/${disk_dev} - ${type_desc}"
                CANDIDATE_DEVICES+=("$dev|$disk_size|$disk_size_raw|$disk_rm|$disk_type|$disk_dev|$disk_model|$disk_rotational")
                CANDIDATE_DESC+=("$type_desc")
            else
                echo "❌ 排除设备：/dev/${disk_dev} - 机械硬盘（容量：${disk_size_raw}，型号：${disk_model}）${hdd_state_desc}"
            fi
        fi
    done < <(find /sys/class/scsi_disk/ -maxdepth 1 -type l)

    echo "---------------------------------------------------"

    # 筛选最佳测试设备（优先U盘，再SSD，最后未休眠HDD）
    TEST_DEVICE=""
    TEST_DEVICE_INFO=""
    candidate_count=${#CANDIDATE_DEVICES[@]}
    if [ "$candidate_count" -gt 0 ]; then
        echo -e "\n正在从 ${candidate_count} 个符合条件的设备中选择测试目标..."

        # 1. 优先挑选U盘（已在筛选时标记为u盘类型，直接匹配）
        for i in "${!CANDIDATE_DEVICES[@]}"; do
            dev_info="${CANDIDATE_DEVICES[$i]}"
            IFS='|' read -r dev size size_raw rm type dev_name model rotational <<< "$dev_info"
            if [ "$type" = "u盘" ]; then
                TEST_DEVICE="$dev"
                TEST_DEVICE_INFO="${CANDIDATE_DESC[$i]}"
                break
            fi
        done

        # 2. 若无U盘，挑选固态硬盘
        if [ -z "$TEST_DEVICE" ]; then
            for i in "${!CANDIDATE_DEVICES[@]}"; do
                dev_info="${CANDIDATE_DEVICES[$i]}"
                IFS='|' read -r dev size size_raw rm type dev_name model rotational <<< "$dev_info"
                if [ "$type" = "ssd" ]; then
                    TEST_DEVICE="$dev"
                    TEST_DEVICE_INFO="${CANDIDATE_DESC[$i]}"
                    break
                fi
            done
        fi

        # 3. 若无SSD，挑选未休眠的机械硬盘
        if [ -z "$TEST_DEVICE" ]; then
            for i in "${!CANDIDATE_DEVICES[@]}"; do
                dev_info="${CANDIDATE_DEVICES[$i]}"
                IFS='|' read -r dev size size_raw rm type dev_name model rotational <<< "$dev_info"
                if [ "$type" = "hdd" ]; then
                    TEST_DEVICE="$dev"
                    TEST_DEVICE_INFO="${CANDIDATE_DESC[$i]}"
                    break
                fi
            done
        fi
    fi

    # 执行模拟触发
    if [ -n "$TEST_DEVICE" ]; then
        echo -e "\n${GREEN}✅ 已选择测试设备：${TEST_DEVICE_INFO}${NC}"
        dev_name=$(basename "$TEST_DEVICE")  # 提取设备系统名称（如0:0:0:0）
        
        # 记录触发前的日志位置（用于后续验证）
        log_position=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)
        
        # 发送add事件
        echo "  向设备 [scsi_disk/$dev_name] 发送add事件，请等待日志验证，大约35秒..."
        if sudo udevadm trigger \
            --subsystem-match=scsi_disk \
            --sysname-match="$dev_name" \
            --action=add; then
            
            # 等待业务脚本运行
            sleep 35
            
            # 检查日志是否有新的触发记录
            new_trigger=$(tail -n +"$log_position" "$LOG_FILE" 2>/dev/null | grep -E "【自动触发-业务脚本启动】")
            if [ -n "$new_trigger" ]; then
                echo -e "  ${GREEN}✓ 设备触发成功，已生成自动触发日志${NC}"
                echo -e "  ${GREEN}✅ udev规则有效性验证成功，请在储存空间1/_HDDlog目录查看完整日志${NC}"
                echo -e "  ${GREEN}初次部署完成日志有两次执行记录，第一次是验证开机自启，第二次是验证udev规则模拟新插入磁盘触发${NC}"
            else
                echo -e "  ${YELLOW}⚠ 设备触发成功，但未检测到新日志（可能udev规则无法触发systemd服务）${NC}"
            fi
        else
            echo -e "  ${RED}✗ 设备触发失败${NC}"
        fi
    else
        echo -e "\n${YELLOW}⚠ 未检测到符合条件的scsi_disk设备（已排除mmc、系统盘和休眠硬盘），跳过模拟测试，请按照后面提示的步骤手动测试${NC}"
    # 手动验证udev步骤提示
        echo -e "${YELLOW}如需验证udev自动触发功能，请按以下步骤：${NC}"
        echo "1. 新插入能被系统识别为SCSI的磁盘（自测U盘可识别）；"
        echo "2. 等待40秒（服务执行延迟）；"
        echo "3. 查看日志：（飞牛系统的储存空间1通常挂载为/vol1/1000，可以在文件管理，储存空间1/_HDDlog目录查看日志文件），终端查看日志指令cat $LOG_FILE"
        echo "4. 若日志中出现【自动触发-业务脚本启动】的最新时间记录，说明udev触发功能正常，能自动配置新插入的磁盘。"
    fi
    echo -e "\n${BOLD}---------------------------------------------------${NC}"
    # 验证udev规则是否生效（仅触发在线设备，避免唤醒休眠硬盘）代码块结束

    sleep 1

    # 部署完成提示（追加日志去色失败，算了）
    echo -e "\n${GREEN}【✅  部署已完成】已启用${SELECTED_FUNC_STR}功能 ${NC}"| tee -a "$LOG_FILE"
    echo -e "【手动操作提示】" | tee -a "$LOG_FILE"
    echo "1. 手动触发业务脚本：sudo $SERVICE_SCRIPT" | tee -a "$LOG_FILE"
    echo "2. 查看完整配置日志：cat $LOG_FILE" | tee -a "$LOG_FILE"
    echo "3. 卸载脚本：重新执行部署脚本并选择选项2" | tee -a "$LOG_FILE"
    echo -e "【日志提示】本日志自动保留最新500行，老旧日志自动清理。如需手动清理可删除日志文件：$LOG_FILE" | tee -a "$LOG_FILE"
}

# 启动交互流程
interactive_step1